package main

import (
	"fmt"
	"go-xorm-01/utils"
	"time"
	"xorm.io/xorm"
	"xorm.io/xorm/log"
	"xorm.io/xorm/names"
)

var engine *xorm.Engine

// 更新时间Updated https://xorm.io/zh/docs/chapter-06/2.updated/
// Updated可以让您在记录插入或每次记录更新时自动更新数据库中的标记字段为当前时间，
// 需要在xorm标记中使用updated标记，如下所示进行标记，对应的字段可以为time.Time或者自定义的time.Time或者int,int64等int类型。
// 在Insert(), InsertOne(), Update()方法被调用时，updated标记的字段将会被自动更新为当前时间，如下所示：
func main() {
	SnakeMapper()
	insetManyUser(engine)
	engine.DumpAllToFile("demo06-update/demo03-updated/sql.sql")
	//updateUser(engine)
}

func updateUser(engine *xorm.Engine) {
	var user0 UserUpdateU
	engine.ID(1).Get(&user0)
	fmt.Println(user0)

	var user2 UserUpdateU = UserUpdateU{
		Username: "tristan--up",
	}
	engine.ID(1).Update(&user2)
	// UPDATE `user_update` SET `username` = ?, `version` = `version` + 1 WHERE `id`=? AND `version`=?
}

func SnakeMapper() {
	engine = utils.GenerateEngine()
	engine.SetMapper(names.SnakeMapper{}) // SnakeMapper 【默认】
	err := engine.Sync2(new(UserUpdateU))
	if err != nil {
		fmt.Printf("err:%v", err)
	}
	engine.ShowSQL(true)
	engine.SetLogLevel(log.LOG_DEBUG)

}

func insetManyUser(engine *xorm.Engine) {
	groupOne := make([]*UserUpdateU, 0)
	for i := 0; i < 5; i++ {
		groupOne = append(groupOne, &UserUpdateU{
			Username: fmt.Sprintf("zhangsan-%d", i),
			Password: fmt.Sprintf("123456-%d", i),
			GroupId:  1,
			Rank:     i,
		})
	}
	engine.Insert(groupOne)

	groupTwo := make([]*UserUpdateU, 0)
	for i := 0; i < 3; i++ {
		groupTwo = append(groupTwo, &UserUpdateU{
			Username: fmt.Sprintf("lisi-%d", i),
			Password: fmt.Sprintf("00000-%d", i),
			GroupId:  2,
			Rank:     i,
		})
	}
	engine.Insert(groupTwo)

}

type JsonTime time.Time

func (j JsonTime) MarshalJSON() ([]byte, error) {
	return []byte(`"` + time.Time(j).Format("2006-01-02 15:04:05") + `"`), nil
}

type UserUpdateU struct {
	Id        int64     `xorm:"pk autoincr"`                                              //指定列名 ，默认id
	Username  string    `xorm:"varchar(25) notnull unique(u_p) 'username' comment('姓名')"` //复合唯一索引
	Password  string    `xorm:"varchar(25) notnull unique(u_p) 'password' comment('密码')"` //复合唯一索引
	TimeOne   time.Time `xorm:"created"`
	TimeTwo   JsonTime  `xorm:"created"`
	TimeThree int64     `xorm:"created"`
	GroupId   int64
	Rank      int
	Version   int       `xorm:"version"`
	UpdatedAt time.Time `xorm:"updated"`
}
